package cn.xkai.exercise.a;

/**
 * @description: 整数反转
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 如果反转后整数超过 32 位的有符号整数的范围[−2 31, 2 31− 1](2147483647) ，就返回 0。
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * <p>
 * 自己的思路：暴力遍历，正负问题，整数溢出问题
 * 借鉴的思路：辗转法，碾转除10得到尾数，然后乘10拼接到新数后面
 * 心得：除10就得到尾数，不需要substr
 * @author: kaixiang
 * @date: 2022-07-04
 **/
public class Solution31 {
    public int reverse(int x) {
        int modulus = x > 0 ? 1 : -1;
        int sum = 0;
        String num = x > 0 ? String.valueOf(x) : String.valueOf(x).substring(1);
        for (int i = 0; i < num.length(); i++) {
            int cnum = Integer.parseInt(num.substring(i, i + 1));
            if (i == 9) {
                if (cnum > 2 || (cnum == 2 && sum >= 147483647)) {
                    return 0;
                }
            }
            sum += cnum * Math.pow(10, i);
        }
        return sum * modulus;
    }

    public int reverseRefer(int x) {
        int res = 0;
        while (x != 0) {
            int t = x % 10;
            int newRes = res * 10 + t;
            //如果数字溢出（溢出会越界，负数变成正数，整数变成负数），直接返回0
            if ((newRes - t) / 10 != res) {
                return 0;
            }
            res = newRes;
            x = x / 10;
        }
        return res;
    }

    public static void main(String[] args) {
        int x = 1563847422;
        Solution31 solution31 = new Solution31();
        System.out.println(solution31.reverseRefer(x));
    }
}
